A typical device driver in a computer system runs a single execution thread that is driven by device interrupts. While a single execution thread is simple to design and implement, there are intrinsic performance and latency issues, mainly, servicing and managing interrupt status is time consuming on a heavy loaded system. Furthermore, a non-realtime operating system cannot guarantee the latency incurred by servicing an interrupt.
A simple change to improve the latency issue is to change a device driver from an interrupt driven operation to a polling operation. However, a polling operation of a device driver increases the central processing unit (CPU) utilization, thus decreasing the efficiency of operations when the device is lightly loaded. The cost and delay of context switching on a non-real-time operating system still exists.
To decrease the overhead for a polling operation, a polling device driver may be split into multiple threads. The multiple thread operation can increase the efficiency of the device driver at the expense of latency. To reduce latency in a multi-core system, a driver thread may be pinned to a particular processor core. This increases the performance but decreases the latency at the cost of underutilizing the processor core. Even if the processor core is not underutilized, the CPU utilization may be unbalanced or the CPU may be overloaded because the processor core is dedicated to the driver.
Some operating systems have a limit on duration for a thread hold onto a processor core before the thread hold is involuntarily pre-empted or voluntarily released. For an operating system with a short execution limit or no real-time scheduling capability, the performance and latency issues become considerable. There is a continuing need in the art for an improved scheduling system that provides increased performance, decreased latency, and proper utilization/balance of the processor core.